package main

import "fmt"

func main() {
	testAdd()
	testAdd2()
}

func testAdd() {
	a := adder()
	fmt.Println(a(10))
	for i := 0; i < 10; i++ {
		fmt.Printf("0 + 1 + ... + %d = %d\n",
			i, a(i))
	}
}
func testAdd2() {
	a := add(0)
	for i := 0; i <= 100; i++ {
		var s int
		s, a = a(i)
		fmt.Printf("0 + 1 + ... + %d = %d\n",
			i, s)
	}
}

/**
没有参数
返回是函数
sum会保存进函数里面
*/
func adder() func(int) int {
	sum := 0                 // sum 自由变量
	return func(v int) int { // 函数体内  ： v 是参数也是局部变量
		sum += v
		return sum
	}
}

// 标准函数式编程
type iAdd func(int) (int, iAdd) // 返回当前加完值 和 下一轮函数

func add(base int) iAdd { // 返回iAdd
	return func(v int) (int, iAdd) {
		return base + v, add(base + v)
	}
}
